{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:29.305297200Z",
     "start_time": "2024-01-13T14:44:24.970960600Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from keras.datasets import mnist\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "model = Sequential([\n",
    "    # 卷积层96个11*11卷积核，步幅4\n",
    "    Conv2D(filters=96, kernel_size=11, strides=4, activation=\"relu\"),\n",
    "    # 池化：窗口大小3*3，步幅2\n",
    "    MaxPooling2D(pool_size=3, strides=2),\n",
    "    # 卷积层256个5*5卷积核，步幅1，使用“same”填充，这意味着输入和输出的高度和宽度将是相同的\n",
    "    Conv2D(filters=256, kernel_size=5, padding=\"same\", activation=\"relu\"),\n",
    "    MaxPooling2D(pool_size=3, strides=2),\n",
    "    Conv2D(filters=384, kernel_size=3, padding=\"same\", activation=\"relu\"),\n",
    "    Conv2D(filters=384, kernel_size=3, padding=\"same\", activation=\"relu\"),\n",
    "    Conv2D(filters=256, kernel_size=3, padding=\"same\", activation=\"relu\"),\n",
    "    MaxPooling2D(pool_size=3, strides=2),\n",
    "    # 伸展到一维向量\n",
    "    Flatten(),\n",
    "    # 全连接层4096个神经元，激活函数relu\n",
    "    Dense(4096, activation=\"relu\"),\n",
    "    Dropout(0.5),\n",
    "    Dense(4096, activation=\"relu\"),\n",
    "    Dropout(0.5),\n",
    "    Dense(10, activation=\"softmax\"),\n",
    "])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:30.204496100Z",
     "start_time": "2024-01-13T14:44:30.114544600Z"
    }
   },
   "id": "719d5bab98e6bbb7"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "x = tf.random.uniform((1, 227, 227, 1))\n",
    "y = model(x)"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "d2690692f4570ee9"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "model.summary()"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "4e1a81cd0d3f7c8c"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "(train_image, train_label), (test_image, test_label) = mnist.load_data()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:33.820829300Z",
     "start_time": "2024-01-13T14:44:33.442049400Z"
    }
   },
   "id": "28baaf8e9e55c38e"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "data": {
      "text/plain": "(60000, 28, 28)"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_image.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:37.347999700Z",
     "start_time": "2024-01-13T14:44:37.318031100Z"
    }
   },
   "id": "851cf488d7e56d3"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "# 维度调整,转换成(60000, 28, 28, 1)\n",
    "train_image = np.reshape(train_image,  # 数据源\n",
    "                         (\n",
    "                             train_image.shape[0],\n",
    "                             train_image.shape[1],\n",
    "                             train_image.shape[2],\n",
    "                             1  # 通道数1\n",
    "                         ))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:37.846716Z",
     "start_time": "2024-01-13T14:44:37.812736200Z"
    }
   },
   "id": "1b168b0fde01325a"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "data": {
      "text/plain": "(60000, 28, 28, 1)"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_image.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:38.532887200Z",
     "start_time": "2024-01-13T14:44:38.508901300Z"
    }
   },
   "id": "38d2a1c75ff29c8b"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [],
   "source": [
    "# 维度调整,转换成(60000, 28, 28, 1)\n",
    "test_image = np.reshape(test_image,  # 数据源\n",
    "                        (\n",
    "                            test_image.shape[0],\n",
    "                            test_image.shape[1],\n",
    "                            test_image.shape[2],\n",
    "                            1  # 通道数1\n",
    "                        ))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:39.025120100Z",
     "start_time": "2024-01-13T14:44:38.994039200Z"
    }
   },
   "id": "4436bf38a918aa91"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "data": {
      "text/plain": "(10000, 28, 28, 1)"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_image.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:44:40.759334100Z",
     "start_time": "2024-01-13T14:44:40.728352500Z"
    }
   },
   "id": "c9364404ccd7c4e0"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 抽取部分样本(可以不跑这部分代码)"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "2523fdedaa7ae01e"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [],
   "source": [
    "# 对训练数据进行抽样 可以不用\n",
    "def get_train(size):\n",
    "    # 随机生成index\n",
    "    index = np.random.randint(0, train_image.shape[0], size)\n",
    "    # 选择图像进行resize\n",
    "    resized_image = tf.image.resize_with_pad(train_image[index], 227, 227)\n",
    "    return resized_image.numpy(), train_label[index]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:43:28.422171800Z",
     "start_time": "2024-01-13T14:43:28.401167200Z"
    }
   },
   "id": "d23e455201f5a6b7"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [],
   "source": [
    "# 对训练数据进行抽样 可以不用\n",
    "def get_test(size):\n",
    "    # 随机生成index\n",
    "    index = np.random.randint(0, test_image.shape[0], size)\n",
    "    # 选择图像进行resize\n",
    "    resized_image = tf.image.resize_with_pad(test_image[index], 227, 227)\n",
    "    return resized_image.numpy(), test_label[index]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:43:28.940122200Z",
     "start_time": "2024-01-13T14:43:28.922131300Z"
    }
   },
   "id": "4e0d687bf19a47d2"
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [],
   "source": [
    "# 抽样结果\n",
    "train_image, train_label = get_train(256)\n",
    "test_image, test_label = get_test(128)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:43:31.700335100Z",
     "start_time": "2024-01-13T14:43:31.492340Z"
    }
   },
   "id": "bb09cbb548e00dc4"
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "data": {
      "text/plain": "(256, 227, 227, 1)"
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_image.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:43:41.526808200Z",
     "start_time": "2024-01-13T14:43:41.482837800Z"
    }
   },
   "id": "e5014c94095037f7"
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "data": {
      "text/plain": "(256,)"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_label.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:43:47.534327500Z",
     "start_time": "2024-01-13T14:43:47.455298700Z"
    }
   },
   "id": "d6c5442e6678412d"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 训练全部样本"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "e83e454f8f7ab80c"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [],
   "source": [
    "train_image = tf.image.resize_with_pad(train_image[:], 227, 227)\n",
    "test_image = tf.image.resize_with_pad(test_image[:], 227, 227)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:45:06.798401100Z",
     "start_time": "2024-01-13T14:44:50.898100Z"
    }
   },
   "id": "44423cd03d74d46f"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "TensorShape([60000, 227, 227, 1])"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_image.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:45:08.544863400Z",
     "start_time": "2024-01-13T14:45:08.467920400Z"
    }
   },
   "id": "fdfd1c6f0f0ff03a"
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [
    {
     "data": {
      "text/plain": "TensorShape([10000, 227, 227, 1])"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_image.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:45:48.645584600Z",
     "start_time": "2024-01-13T14:45:48.595613600Z"
    }
   },
   "id": "10b43212f809981d"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 查看图像"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "7e2168644014ac79"
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plt.imshow(train_image[1].astype(np.int8).squeeze(), cmap=\"gray\")\n",
    "plt.imshow(train_image[1], cmap=\"gray\")\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T14:46:17.465760700Z",
     "start_time": "2024-01-13T14:46:17.330821400Z"
    }
   },
   "id": "cbfea8d929e9491e"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 模型编译"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "def20c1f76aa1d6b"
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'model' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[1], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m opt \u001B[38;5;241m=\u001B[39m \u001B[43mmodel\u001B[49m\u001B[38;5;241m.\u001B[39mcompile(\n\u001B[0;32m      2\u001B[0m     optimizer\u001B[38;5;241m=\u001B[39mtf\u001B[38;5;241m.\u001B[39mkeras\u001B[38;5;241m.\u001B[39moptimizers\u001B[38;5;241m.\u001B[39mSGD(learning_rate\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0.01\u001B[39m,momentum\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0.0\u001B[39m),\n\u001B[0;32m      3\u001B[0m     loss\u001B[38;5;241m=\u001B[39mtf\u001B[38;5;241m.\u001B[39mkeras\u001B[38;5;241m.\u001B[39mlosses\u001B[38;5;241m.\u001B[39msparse_categorical_crossentropy,\n\u001B[0;32m      4\u001B[0m     metrics\u001B[38;5;241m=\u001B[39m[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124maccuracy\u001B[39m\u001B[38;5;124m\"\u001B[39m],\n\u001B[0;32m      5\u001B[0m     loss_weights\u001B[38;5;241m=\u001B[39m[\u001B[38;5;241m1\u001B[39m,\u001B[38;5;241m0.3\u001B[39m,\u001B[38;5;241m0.3\u001B[39m]\n\u001B[0;32m      6\u001B[0m )\n",
      "\u001B[1;31mNameError\u001B[0m: name 'model' is not defined"
     ]
    }
   ],
   "source": [
    "opt = model.compile(\n",
    "    optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),\n",
    "    loss=tf.keras.losses.sparse_categorical_crossentropy,\n",
    "    metrics=[\"accuracy\"]\n",
    ")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T13:43:01.562269600Z",
     "start_time": "2024-01-14T13:43:01.138510800Z"
    }
   },
   "id": "b8af78c619f9a4be"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 模型训练"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "86d09b7dcc8dbd4c"
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "118/118 [==============================] - 432s 4s/step - loss: 3.2218 - accuracy: 0.1502 - val_loss: 2.2546 - val_accuracy: 0.1956\n",
      "Epoch 2/5\n",
      "118/118 [==============================] - 427s 4s/step - loss: 2.2053 - accuracy: 0.2156 - val_loss: 2.1229 - val_accuracy: 0.3803\n",
      "Epoch 3/5\n",
      "118/118 [==============================] - 424s 4s/step - loss: 1.0374 - accuracy: 0.6522 - val_loss: 0.2146 - val_accuracy: 0.9286\n",
      "Epoch 4/5\n",
      "118/118 [==============================] - 425s 4s/step - loss: 0.1984 - accuracy: 0.9377 - val_loss: 0.1197 - val_accuracy: 0.9599\n",
      "Epoch 5/5\n",
      "118/118 [==============================] - 425s 4s/step - loss: 0.1179 - accuracy: 0.9630 - val_loss: 0.0684 - val_accuracy: 0.9769\n"
     ]
    }
   ],
   "source": [
    "his = model.fit(train_image,\n",
    "                train_label,\n",
    "                batch_size=512,\n",
    "                epochs=5,\n",
    "                # validation_split=0.1,\n",
    "                validation_data=(test_image,test_label),\n",
    "                verbose=1\n",
    "                )"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T15:24:31.076694700Z",
     "start_time": "2024-01-13T14:48:59.220326700Z"
    }
   },
   "id": "46974c83ecd371a8"
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "313/313 [==============================] - 34s 108ms/step - loss: 0.0684 - accuracy: 0.9769\n"
     ]
    },
    {
     "data": {
      "text/plain": "[0.06842289865016937, 0.9768999814987183]"
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(test_image, test_label)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T15:25:52.771070200Z",
     "start_time": "2024-01-13T15:25:18.915623Z"
    }
   },
   "id": "4bc7461c4ba09415"
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [],
   "source": [
    "model.save('手写字识别AlexNet.h5')"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-13T15:26:28.140361800Z",
     "start_time": "2024-01-13T15:26:27.773179100Z"
    }
   },
   "id": "97bb2697479b2a09"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "88f6f83f6375178c"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "570fcb579a9ce42"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
